package org.spring.bean.factory.config;

import org.spring.bean.exceptions.BeansException;
import org.spring.bean.factory.support.AbstractBeanDefinition;

/**
 * {@link BeanPostProcessor}的子接口，它添加了一个销毁前回调函数。
 * <p>
 * 典型的用法是调用特定bean类型的自定义销毁回调，匹配相应的初始化回调。
 *
 * @author 李坤
 * @date 2022/4/23 23:33
 */
public interface DestructionAwareBeanPostProcessor extends BeanPostProcessor {

    /**
     * 在bean实例被销毁之前应用这个BeanPostProcessor，例如调用自定义销毁回调。
     * <p>
     * 就像DisposableBean的{@code destroy}和一个自定义的destroy方法一样，这个回调只适用于那些由容器完全管理其生命周期的bean。
     * 这通常是单例bean和作用域bean的情况。
     *
     * @param bean     要销毁的 bean 实例
     * @param beanName bean 的名称
     *
     * @throws BeansException 以防出现错误
     * @see DisposableBean#destroy()
     * @see AbstractBeanDefinition#setDestroyMethodName(String)
     */
    void postProcessBeforeDestruction(Object bean, String beanName) throws BeansException;

    /**
     * 确定给定的bean实例是否需要由这个后处理器销毁。
     * <p>
     * 默认实现返回{@code true}。如果5之前的{@code DestructionAwareBeanPostProcessor}实现没有提供这个方法的具体实现，Spring也会静默地假定为true。
     *
     * @param bean 要检查的bean实例
     *
     * @return 如果该bean实例最终需要调用{@link postProcessBeforeDestruction}，则为{@code true};如果不需要，则为{@code false}
     *
     * @since 4.3
     */
    default boolean requiresDestruction(Object bean) {
        return true;
    }

}
